템플릿을 이용해면 객체를 생성하지 않더라도, 타입에 어떠한 값을 부여할 수 있고,
해당 타입을 이용해서 연산을 할 수 있다.
타입은 반드신 컴파일 타임에 확정되어야 하므로, 컴파일 타임에 모든 연산이 끝나게 된다.
이와 같이 타입을 가지고 컴파일 타임에 생성되는 코드로 프로그래밍하는 것을
메타 프로그래밍(meta progrmming)이라고 한다.
C++에서는 템플릿을 이용해서 메타 프로그래밍을 할 수 있다.
위 코드에서 실질적으로 값을 가지는 객체는 존재하지 않는다.
연산 결과인 720이라는 값은 컴파일러가 만들어낸 Factorial<6>이라는 타입을 나타내고 있을 뿐이다.
템플릿 메타 프로그램이으로 작성된 코드는 모두 컴파일 타임에 모든 연산이 종료된다.
따라서 프로그램 실행 소곧를 향상 시킬 수 있다.
(컴파일 시간은 많이 늘어나게 됨)
메타 프로그래밍은 구조가 매우 복잡하며, 작성된 코드에서 버그를 찾는 것이 매우 어렵다.
기본적으로 컴파일 타임에 연산을 하기 때문에 디버깅이 불가능하고, C++ 컴파일러는 특성상 템플릿 오류 시
긴 오류를 출력하게 된다.